package com.example.myweb.Domain.Entity;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

/**
 * 这是一个JPA属性转换器，用于处理 ContentTopic.ContentType 枚举和数据库字符串之间的映射。
 * 它的核心作用是：
 * 1. 保存到数据库时，总是存入大写的枚举名 (例如 'ARTICLE')。
 * 2. 从数据库读取时，能兼容各种大小写的字符串 (例如 'article', 'Article', 'ARTICLE')，并将其转换为正确的枚举。
 *
 * @Converter(autoApply = true) 会让JPA自动对项目中所有 ContentTopic.ContentType 类型的字段应用此转换器。
 */
@Converter(autoApply = true)
public class ContentTypeConverter implements AttributeConverter<ContentTopic.ContentType, String> {

    /**
     * 将Java实体中的枚举类型，转换为要存入数据库的字符串。
     * @param attribute 枚举实例 (例如 ContentTopic.ContentType.ARTICLE)
     * @return 存入数据库的字符串 (例如 "ARTICLE")
     */
    @Override
    public String convertToDatabaseColumn(ContentTopic.ContentType attribute) {
        if (attribute == null) {
            return null;
        }
        // 我们约定，存入数据库的永远是标准的大写枚举名
        return attribute.name();
    }

    /**
     * 将从数据库中读取出来的字符串，转换为Java实体中的枚举类型。
     * @param dbData 数据库中存储的字符串 (可能是 'article', 'ARTICLE' 等)
     * @return 对应的枚举实例 (例如 ContentTopic.ContentType.ARTICLE)
     */
    @Override
    public ContentTopic.ContentType convertToEntityAttribute(String dbData) {
        if (dbData == null || dbData.trim().isEmpty()) {
            return null;
        }
        try {
            // 这是关键：无论数据库里存的是什么大小写，我们都先转成大写，再用 valueOf 查找
            return ContentTopic.ContentType.valueOf(dbData.toUpperCase());
        } catch (IllegalArgumentException e) {
            // 如果数据库中的值是一个无效的字符串 (比如 'book')，则抛出异常
            // 这样可以及早发现数据问题
            throw new IllegalArgumentException("数据库中存在未知的 ContentType 值: " + dbData, e);
        }
    }
}